package com.hykj.xxltest.utils;

import com.alibaba.fastjson.JSON;
import com.hykj.xxltest.base.MsgException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.util.*;

/**
 * 操作Excel表格的功能类
 */
public class ExcelReader {
    private POIFSFileSystem fs;
    private HSSFWorkbook wb;
    private Sheet sheet;
    private Row row;

    /**
     * 读取Excel表格表头的内容
     *
     * @return String 表头内容的数组
     */
    public String[] readExcelTitle(InputStream is) {
        try {
            fs = new POIFSFileSystem(is);
            wb = new HSSFWorkbook(fs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        row = sheet.getRow(0);
// 标题总列数
        int colNum = row.getPhysicalNumberOfCells();
        System.out.println("colNum:" + colNum);
        String[] title = new String[colNum];
        for (int i = 0; i < colNum; i++) {
//title[i] = getStringCellValue(row.getCell((short) i));
            title[i] = getCellFormatValue(row.getCell((short) i));
        }
        return title;
    }


    /**
     * 读取Excel数据内容
     *
     * @return Map 包含单元格数据内容的Map对象
     */
    public Map<Integer, List<String>> readExcelContent(InputStream is) {
        Map<Integer, List<String>> content;
        try {
            fs = new POIFSFileSystem(is);
            wb = new HSSFWorkbook(fs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        content = readExcelContentFromSheet(sheet);
        return content;
    }


    public Map<Integer, List<String>> readFile(File file) {
        Map<Integer, List<String>> content;
        Workbook workbook = null;
        try {
            workbook = new XSSFWorkbook(file);
        } catch (Exception e) {
            throw new MsgException("读取文件出错");
        }
        System.out.println("xxxxx");
        Sheet sheet = workbook.getSheetAt(0);
        Map<Integer, List<String>> map = readExcelContentFromSheet(sheet);
        return map;
    }


    public Map<Integer, List<String>> readExcelContentFromSheet(Sheet sheet) {
        Map<Integer, List<String>> content = new HashMap<>();
// 得到总行数
        int rowNum = sheet.getLastRowNum();
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
// 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            List<String> contentList = new ArrayList<>();
            while (j < colNum) {
// 每个单元格的数据内容用"-"分割开，以后需要时用String类的replace()方法还原数据
// 也可以将每个单元格的数据设置到一个javabean的属性中，此时需要新建一个javabean
// str += getStringCellValue(row.getCell((short) j)).trim() +
// "-";

                String str = getCellFormatValue(row.getCell((short) j)).trim();
                contentList.add(j, str);
                j++;
            }
            content.put(i, contentList);
        }
        return content;
    }

    /**
     * 获取单元格数据内容为字符串类型的数据
     *
     * @param cell Excel单元格
     * @return String 单元格数据内容
     */
    private String getStringCellValue(HSSFCell cell) {
        String strCell = "";
        switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING:
                strCell = cell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                strCell = String.valueOf(cell.getNumericCellValue());
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                strCell = String.valueOf(cell.getBooleanCellValue());
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                strCell = "";
                break;
            default:
                strCell = "";
                break;
        }

        if (strCell.equals("") || strCell == null) {
            return "";
        }
        if (cell == null) {
            return "";
        }
        return strCell;
    }

    /**
     * 获取单元格数据内容为日期类型的数据
     *
     * @param cell Excel单元格
     * @return String 单元格数据内容
     */
    private String getDateCellValue(HSSFCell cell) {
        String result = "";
        try {
            int cellType = cell.getCellType();
            if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
                Date date = cell.getDateCellValue();
                result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
                        + "-" + date.getDate();
            } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
                String date = getStringCellValue(cell);
                result = date.replaceAll("[年月]", "-").replace("日", "").trim();
            } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
                result = "";
            }
        } catch (Exception e) {
            System.out.println("日期格式不正确!");
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 根据HSSFCell类型设置数据
     *
     * @param cell
     * @return
     */
    private String getCellFormatValue(Cell cell) {
        String cellvalue = "";
        if (cell != null) {
// 判断当前Cell的Type
            switch (cell.getCellType()) {
// 如果当前Cell的Type为NUMERIC
                case HSSFCell.CELL_TYPE_NUMERIC:
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA: {

// 取得当前Cell的数值

                    cellvalue = cell.getCellFormula();


                }
                break;
// 如果当前Cell的Type为STRIN
                case HSSFCell.CELL_TYPE_STRING:
// 取得当前的Cell字符串
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
// 默认的Cell值
                default:
                    cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;

    }

    public static void main(String[] args) throws Exception {
        try {
// 对读取Excel表格标题测试
            ExcelReader excelReader = new ExcelReader();
//            InputStream is = new FileInputStream("e:\\q.xls");
//            String[] title = excelReader.readExcelTitle(is);
//            System.out.println("获得Excel表格的标题:");
//for (String s : title) {
//                System.out.print(s + " ");
//            }

// 对读取Excel表格内容测试
            InputStream is2 = new FileInputStream("E:\\项目\\智享婴品\\爬虫数据\\1161207.xlsx");

            File file = new File("E:\\项目\\智享婴品\\爬虫数据\\goods_1.xlsx");
            System.out.println("file");
            Workbook workbook = new XSSFWorkbook(file);
            System.out.println("xxxxx");
            Sheet sheet = workbook.getSheetAt(0);
            Map<Integer, List<String>> map = excelReader.readExcelContentFromSheet(sheet);
            System.out.println("获得Excel表格的内容:");
            System.out.println(JSON.toJSONString(map));
            for (int i = 1; i <= map.size(); i++) {
                System.out.println(JSON.toJSONString(map.get(i)));
            }

        } catch (FileNotFoundException e) {
            System.out.println("未找到指定路径的文件!");
            e.printStackTrace();
        }
    }
}
